
package com.cloud.jvm;

/**
 * 通过类的加载机制研究
 * 通过内部静态类实现懒加载单例模式
 * 的原理
 * 这里有点问题:
 * 因为jvm保证了类的加载和初始化的懒惰的
 * 所以当一个类只有实例方法和单例所需的静态方法和属性，
 * 而没有其他任何静态方法和属性，
 * 在使用java默认的类加载器时有无必要使用更加复杂的DCL懒汉模式
 */
public final class Singleton {

    private Singleton(){}

    //访问static final修饰的基本类型的成员变量不会触发类的初始化
    public static final int var = 10;

    private static class SingletonHolder {
        public static final Singleton instance = new Singleton();
        static {
            System.out.println("SingletonHolder is init");
        }
    }

    //会导致Singleton的初始化
    public static Singleton getInstance() {
        //导致内部类的加载，同时触发其初始化
        return SingletonHolder.instance;
    }

    static {
        System.out.println("Singleton is init");
    }
}
